package util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.security.SecureRandom;

/**
 * 计算工具类
 *
 * @author zhanglinfeng
 * @date create in 2023/6/6 10:11
 */
public class MathUtil {

    /**
     * 加法
     *
     * @param data1 加数1
     * @param data2 加数2
     * @return BigDecimal
     */
    public static BigDecimal add(double data1, double data2) {
        return new BigDecimal(data1).add(new BigDecimal(data2));
    }

    /**
     * 加法
     *
     * @param data1 加数1
     * @param data2 加数2
     * @param scale 小数位数
     * @return BigDecimal
     */
    public static BigDecimal add(double data1, double data2, int scale) {
        return add(data1, data2).setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 减法
     *
     * @param data1 被减数
     * @param data2 减数
     * @return BigDecimal
     */
    public static BigDecimal subtract(double data1, double data2) {
        return new BigDecimal(data1).subtract(new BigDecimal(data2));
    }

    /**
     * 减法
     *
     * @param data1 被减数
     * @param data2 减数
     * @param scale 小数位数
     * @return BigDecimal
     */
    public static BigDecimal subtract(double data1, double data2, int scale) {
        return subtract(data1, data2).setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 乘法
     *
     * @param data1 乘数1
     * @param data2 乘数2
     * @return BigDecimal
     */
    public static BigDecimal multiply(double data1, double data2) {
        return new BigDecimal(data1).multiply(new BigDecimal(data2));
    }

    /**
     * 乘法
     *
     * @param data1 乘数1
     * @param data2 乘数2
     * @param scale 小数位数
     * @return BigDecimal
     */
    public static BigDecimal multiply(double data1, double data2, int scale) {
        return multiply(data1, data2).setScale(scale, RoundingMode.HALF_UP);
    }

    /**
     * 除法
     *
     * @param data1 被除数1
     * @param data2 除数2
     * @param scale 小数位数
     * @return BigDecimal
     */
    public static BigDecimal divide(double data1, double data2, int scale) {
        return new BigDecimal(data1).divide(new BigDecimal(data2), scale, RoundingMode.HALF_UP);
    }

    /**
     * 求百分比
     *
     * @param data1 被除数1
     * @param data2 除数2
     * @param scale 小数位数
     * @return BigDecimal
     */
    public static BigDecimal percentage(Integer data1, Integer data2, int scale) {
        return new BigDecimal(data1).multiply(new BigDecimal(100)).divide(new BigDecimal(data2), scale, RoundingMode.HALF_UP);
    }

    /**
     * 指定位数的随机数
     *
     * @param digit 位数
     * @return int
     */
    public static int randomNum(int digit) {
        SecureRandom random = new SecureRandom();
        StringBuilder returnValue = new StringBuilder();
        for (int i = 0; i < digit; i++) {
            returnValue.append(random.nextInt(10));
        }
        return Integer.parseInt(returnValue.toString());
    }

    /**
     * 指定范围内的随机数
     *
     * @param min 最小数
     * @param max 最大数
     * @return int
     */
    public static int randomNum(int min, int max) {
        return new SecureRandom().nextInt(max-min+1)+min;
    }
}
